/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.model.Usuari;

import edu.uoc.tfc.exuoc.errors.BuitException;
import java.io.UnsupportedEncodingException;
import org.hibernate.HibernateException;
import java.util.Iterator;
import edu.uoc.tfc.exuoc.utils.Eines;
/**
 * Classe que gestionarà la persistència mitjançant la classe
 * GestorBDD (genèrica)
 *
 * @author Emili A. Moreno Ruiz
 */
public class UsuarisDAO {
    private GestorBDD gd=new GestorBDD();
    private GestorLogs  log=GestorLogs .getLogger(this.getClass().getName());

    protected UsuarisDAO(){
    }

    public void tancarConnexio() throws HibernateException{
        gd.close();
        gd=null;
    }



    public Long afegir(Usuari usuari) throws HibernateException, BuitException
             {
        Long id=Config.valorNull;

        try {
            //08/12/2011:Emili:gd.begin();
                id=gd.afegir(usuari);


        }catch (HibernateException e){
            log.error("DAO:Afegir:No s'ha pogut afegir l`usuari:"
                    +usuari.getLogin()+"."+e.getLocalizedMessage());
            //throw e;
            id=Config.valorNull;
        }catch (BuitException e){
            log.error("DAO:Afegir:No s'ha pogut afegir l`usuari:"
                    +usuari.getLogin()+"."+e.getLocalizedMessage());
            //throw e;
            id=Config.valorNull;
        }
        return id;
    }

    public void eliminar(Usuari usuari) throws HibernateException, BuitException{
        try {
            //08/12/2011:Emili:gd.begin();
            gd.eliminar(usuari);
        }catch (HibernateException e){
            log.error("No s'ha pogut eliminar l`usuari({})  ",usuari.getClass().getCanonicalName());
            throw e;
        }catch (BuitException e){
            log.error("No s'ha pogut eliminar l`usuari({})  ",usuari.getClass().getCanonicalName());
            throw e;
        }
    }

   

    public void modificar(Usuari usuari) throws HibernateException, BuitException{
            try {
                //08/12/2011:Emili:gd.begin();
                gd.modificar(usuari);
            }catch (HibernateException e){
                log.error("No s'ha pogut modificar l`usuari({})  ",usuari.getNom());
                throw e;
            }catch (BuitException e){
            log.error("No s'ha pogut modificar l`usuari({})  ",usuari.getClass().getCanonicalName());
            throw e;
        }finally{
               // gd.close();
            }

    }
    public Usuari consulta(Long id) throws HibernateException, BuitException {
        Usuari usu=null;
        try{
           //08/12/2011:Emili: gd.begin();
            usu=(Usuari)gd.llegir(Usuari.class, id);
        }catch(HibernateException e){
            log.error("DAO:Consulta:No s'ha pogut obtenir l`usuari amb id:  "
                    +String.valueOf(id));
            //throw e;

        }catch (BuitException e){
            log.error("DAO:Consulta:Usuari buit, amb id"
                    +String.valueOf(id));
            throw e;
        }
        return usu;
    }

    public Usuari consulta(String camp, Object valor) throws HibernateException
            , BuitException, UnsupportedEncodingException {
        Usuari usu=null;
        try{
            //08/12/2011:Emili:gd.begin();
            usu=(Usuari)gd.llegir(Usuari.class,camp, valor);
        }catch(HibernateException e){
            log.error("DAO:consulta: No s'ha pogut obtenir les dades segons el "
                    +"criteri:camp:"+camp+" valor:"+valor.toString());
            //throw e;

        }catch (BuitException e){
            log.info("DAO:Consulta:No s'ha pogut obtenir l`usuari. No existeix "
                    +"el login: "+String.valueOf(valor));
            throw e;
        }catch (UnsupportedEncodingException e){
            log.error("DAO:Consulta:No s'ha pogut obtenir l`usuari. Error de "+
                    "paràmetres  ");
            throw e;
        }
        return usu;
    }

    public Usuari consulta(Class classe ,Long id)
            throws HibernateException, BuitException {
        Usuari usu=null;
        try{
            //08/12/2011:Emili:gd.begin();
            usu=(Usuari)gd.llegir(classe, id);

        }catch(HibernateException e){
            log.error("No s'ha pogut obtenir l`usuari :{}  ",String.valueOf(id));
            //throw e;
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir l`usuari ({})  ",String.valueOf(id));
            throw e;
        }
        return usu;
    }
    
    public Iterator<Usuari> llista()  throws HibernateException, BuitException{
        Iterator<Usuari> llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();

            //log.info("DAO:Llista():");
            llistat= (Iterator<Usuari>) gd.Llista(Usuari.class).iterator();
            //log.info("DAO: llista() despres");
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat  d`usuaris");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }
    
    public Iterator<Usuari> llista(int ini, int fi)  throws HibernateException, BuitException{
        Iterator llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();
            //llistat= gd.Llista(Contenidor.class,ini,fi);
            llistat= (Iterator) gd.Llista(Usuari.class, ini, fi, "id", Config.ORDRE).iterator();
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat d`usuaris");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }

    public Iterator<Usuari> llista(String ordre, int quants)  throws HibernateException, BuitException{
        Iterator<Usuari> llistat =null;
        try{
            //08/12/2011:Emili:gd.begin();
            llistat= (Iterator<Usuari>) gd.Llista(Usuari.class,ordre,quants,"dataalta").iterator();
        }catch (BuitException e){
            log.error("No s'ha pogut obtenir el llistat d`usuaris");
            throw e;
        }
        finally{
           // gd.close();
        }
        return llistat;
    }


    public int quants()throws HibernateException, BuitException{
         Integer quants=Config.valorNullInt;

        try {
           //08/12/2011:Emili: gd.begin();
            quants=gd.quants( Usuari.class);
        }catch (HibernateException e){
            log.error("Error en la connexió amb la bdd. No s'ha pogut obtenir el nombre d`usuaris.");

        }catch (BuitException e){
            log.error("No hi ha usuaris.");

        }
        return quants;
    }
    

    /*****************************************************************
     *
     * TEST
     *
     */
    private void testLlistat(UsuarisDAO uDao) {
         Iterator<Usuari> it=null;
        try {
            it= uDao.llista("desc",7);
            Usuari usuari=null;
            Eines.escriu("Prova llistat Usuaris");
            Eines.escriu("=========================");
            while (it.hasNext()){
                usuari=it.next();
                Eines.escriu("-"    +usuari.toString());
            }
        }catch(HibernateException e){
            log.error("Error hibernate llistat");
        }catch(BuitException e){
            log.error("Error Buit llistat");
        }
       
        Eines.escriu("");
    }
    private void testConsulta (UsuarisDAO uDao) {
        Usuari usuari=null;
        try {
            usuari=uDao.consulta(1L);

            Eines.escriu("Prova consulta Usuari");
            Eines.escriu("=========================");
        
            Eines.escriu("Usuari :"+usuari.toString());
        }catch(HibernateException e){
            log.error("Error hibernate consulta");
        }catch(BuitException e){
            log.error("Error Buit consulta");
        }
        Eines.escriu("");
    }
   
    private void testQuants(UsuarisDAO uDao){
        Eines.escriu("Prova quants Usuaris");
        Eines.escriu("========================");
        try {
            Eines.escriu(uDao.quants());
        } catch (HibernateException ex) {
            this.log.error("Error en la connexió a la bdd");
        } catch (BuitException ex) {
            this.log.error("No hi ha Usuaris");
        }
        Eines.escriu("");
    }

    public static void main(String args[]) {
        UsuarisDAO uDao = new UsuarisDAO();
        uDao.testLlistat(uDao);
        //uDao.testConsulta(uDao);
        //uDao.testQuants(uDao);


        uDao.tancarConnexio();

    }
}
